home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / Effects / Alienwah.C next >
C/C++ Source or Header  |  2005-03-14  |  6KB  |  245 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   Alienwah.C - "AlienWah" effect
  5.   Copyright (C) 2002-2005 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22.  
  23. #include <math.h>
  24. #include "Alienwah.h"
  25. #include <stdio.h>
  26.  
  27. Alienwah::Alienwah(int insertion_,REALTYPE *efxoutl_,REALTYPE *efxoutr_){
  28.     efxoutl=efxoutl_;
  29.     efxoutr=efxoutr_;
  30.         
  31.     oldl=NULL;
  32.     oldr=NULL;
  33.     filterpars=NULL;
  34.     insertion=insertion_;
  35.  
  36.     Ppreset=0;
  37.     setpreset(Ppreset);
  38.     cleanup();
  39.     oldclfol.a=fb;oldclfol.b=0.0;
  40.     oldclfor.a=fb;oldclfor.b=0.0;
  41. };
  42.  
  43. Alienwah::~Alienwah(){
  44.     if (oldl!=NULL) delete [] oldl;
  45.     if (oldr!=NULL) delete [] oldr ;
  46. };
  47.  
  48.  
  49. /*
  50.  * Apply the effect
  51.  */
  52. void Alienwah::out(REALTYPE *smpsl,REALTYPE *smpsr){
  53.     int i;
  54.     REALTYPE lfol,lfor;
  55.     COMPLEXTYPE clfol,clfor,out,tmp;
  56.  
  57.     lfo.effectlfoout(&lfol,&lfor);
  58.     lfol*=depth*PI*2.0;lfor*=depth*PI*2.0;
  59.     clfol.a=cos(lfol+phase)*fb;clfol.b=sin(lfol+phase)*fb;
  60.     clfor.a=cos(lfor+phase)*fb;clfor.b=sin(lfor+phase)*fb;
  61.  
  62.     for (i=0;i<SOUND_BUFFER_SIZE;i++){    
  63.     REALTYPE x=((REALTYPE) i)/SOUND_BUFFER_SIZE;
  64.     REALTYPE x1=1.0-x;
  65.     //left    
  66.     tmp.a=clfol.a*x+oldclfol.a*x1;
  67.     tmp.b=clfol.b*x+oldclfol.b*x1;
  68.     
  69.     out.a=tmp.a*oldl[oldk].a-tmp.b*oldl[oldk].b
  70.          +(1-fabs(fb))*smpsl[i]*panning;
  71.     out.b=tmp.a*oldl[oldk].b+tmp.b*oldl[oldk].a;
  72.     oldl[oldk].a=out.a;
  73.     oldl[oldk].b=out.b;
  74.     REALTYPE l=out.a*10.0*(fb+0.1);
  75.     
  76.     //right
  77.     tmp.a=clfor.a*x+oldclfor.a*x1;
  78.     tmp.b=clfor.b*x+oldclfor.b*x1;
  79.     
  80.     out.a=tmp.a*oldr[oldk].a-tmp.b*oldr[oldk].b
  81.          +(1-fabs(fb))*smpsr[i]*(1.0-panning);
  82.     out.b=tmp.a*oldr[oldk].b+tmp.b*oldr[oldk].a;
  83.     oldr[oldk].a=out.a;
  84.     oldr[oldk].b=out.b;
  85.     REALTYPE r=out.a*10.0*(fb+0.1);
  86.  
  87.  
  88.     if (++oldk>=Pdelay) oldk=0;
  89.     //LRcross
  90.     efxoutl[i]=l*(1.0-lrcross)+r*lrcross;
  91.     efxoutr[i]=r*(1.0-lrcross)+l*lrcross;
  92.     };
  93.  
  94.     oldclfol.a=clfol.a;oldclfol.b=clfol.b;
  95.     oldclfor.a=clfor.a;oldclfor.b=clfor.b;
  96.  
  97. };
  98.  
  99. /*
  100.  * Cleanup the effect
  101.  */
  102. void Alienwah::cleanup(){
  103.     for (int i=0;i<Pdelay;i++) {
  104.     oldl[i].a=0.0;
  105.     oldl[i].b=0.0;
  106.     oldr[i].a=0.0;
  107.     oldr[i].b=0.0;
  108.     };
  109.     oldk=0;
  110. };
  111.  
  112.  
  113. /*
  114.  * Parameter control
  115.  */
  116.  
  117. void Alienwah::setdepth(unsigned char Pdepth){
  118.     this->Pdepth=Pdepth;
  119.     depth=(Pdepth/127.0);
  120. };
  121.  
  122. void Alienwah::setfb(unsigned char Pfb){
  123.     this->Pfb=Pfb;
  124.     fb=fabs((Pfb-64.0)/64.1);
  125.     fb=sqrt(fb);
  126.     if (fb<0.4) fb=0.4;
  127.     if (Pfb<64) fb=-fb;
  128. };
  129.  
  130. void Alienwah::setvolume(unsigned char Pvolume){
  131.     this->Pvolume=Pvolume;
  132.     outvolume=Pvolume/127.0;
  133.     if (insertion==0) volume=1.0;
  134.     else volume=outvolume;
  135. };
  136.  
  137. void Alienwah::setpanning(unsigned char Ppanning){
  138.     this->Ppanning=Ppanning;
  139.     panning=Ppanning/127.0;
  140. };
  141.  
  142. void Alienwah::setlrcross(unsigned char Plrcross){
  143.     this->Plrcross=Plrcross;
  144.     lrcross=Plrcross/127.0;
  145. };
  146.  
  147. void Alienwah::setphase(unsigned char Pphase){
  148.     this->Pphase=Pphase;
  149.     phase=(Pphase-64.0)/64.0*PI;
  150. };
  151.  
  152. void Alienwah::setdelay(unsigned char Pdelay){
  153.     if (oldl!=NULL) delete [] oldl;
  154.     if (oldr!=NULL) delete [] oldr;
  155.     if (Pdelay>=MAX_ALIENWAH_DELAY) Pdelay=MAX_ALIENWAH_DELAY;
  156.     this->Pdelay=Pdelay;
  157.     oldl=new COMPLEXTYPE[Pdelay];
  158.     oldr=new COMPLEXTYPE[Pdelay];
  159.     cleanup();
  160. };
  161.  
  162. void Alienwah::setpreset(unsigned char npreset){
  163.     const int PRESET_SIZE=11;
  164.     const int NUM_PRESETS=4;
  165.     unsigned char presets[NUM_PRESETS][PRESET_SIZE]={
  166.     //AlienWah1
  167.     {127,64,70,0,0,62,60,105,25,0,64},
  168.     //AlienWah2
  169.     {127,64,73,106,0,101,60,105,17,0,64},
  170.     //AlienWah3
  171.     {127,64,63,0,1,100,112,105,31,0,42},
  172.     //AlienWah4
  173.     {93,64,25,0,1,66,101,11,47,0,86}};
  174.     
  175.     if (npreset>=NUM_PRESETS) npreset=NUM_PRESETS-1;
  176.     for (int n=0;n<PRESET_SIZE;n++) changepar(n,presets[npreset][n]);
  177.     if (insertion==0) changepar(0,presets[npreset][0]/2);//lower the volume if this is system effect
  178.     Ppreset=npreset;
  179. };
  180.  
  181.  
  182. void Alienwah::changepar(int npar,unsigned char value){
  183.     switch(npar){
  184.     case 0:    setvolume(value);
  185.             break;
  186.     case 1:    setpanning(value);
  187.             break;
  188.     case 2:    lfo.Pfreq=value;
  189.             lfo.updateparams();
  190.         break;    
  191.     case 3:    lfo.Prandomness=value;
  192.             lfo.updateparams();
  193.         break;    
  194.     case 4:    lfo.PLFOtype=value;
  195.             lfo.updateparams();
  196.         break;    
  197.     case 5:    lfo.Pstereo=value;
  198.             lfo.updateparams();
  199.         break;    
  200.     case 6:    setdepth(value);
  201.             break;
  202.     case 7:    setfb(value);
  203.             break;
  204.     case 8:    setdelay(value);
  205.             break;
  206.     case 9:    setlrcross(value);
  207.             break;
  208.     case 10:setphase(value);
  209.             break;
  210.     };
  211. };
  212.  
  213. unsigned char Alienwah::getpar(int npar){
  214.     switch (npar){
  215.     case 0:    return(Pvolume);
  216.         break;
  217.     case 1:    return(Ppanning);
  218.         break;
  219.     case 2:    return(lfo.Pfreq);
  220.         break;
  221.     case 3:    return(lfo.Prandomness);
  222.         break;
  223.     case 4:    return(lfo.PLFOtype);
  224.         break;
  225.     case 5:    return(lfo.Pstereo);
  226.         break;
  227.     case 6:    return(Pdepth);
  228.         break;
  229.     case 7:    return(Pfb);
  230.         break;
  231.     case 8:    return(Pdelay);
  232.         break;
  233.     case 9:    return(Plrcross);
  234.         break;
  235.     case 10:return(Pphase);
  236.         break;
  237.     default:return (0);
  238.     };
  239.     
  240. };
  241.  
  242.  
  243.  
  244.  
  245.